home *** CD-ROM | disk | FTP | other *** search
- /**********************************************************************\
-
- FISHTANK.C -- This program demonstrates multi-object non-destructive
- animation. The coral background is displayed on page 2 and copied to
- page 0, the visual page. A packed pixel run file containing the 6 fish
- is displayed on page 1, and then fg_getimage is used to load the fish
- into the fish bitmaps.
-
- To make the fish move, the background is copied to page 1 and the fish
- are put over the background using fg_clpimage and fg_flpimage. The
- fish are clipped at the edge of the screen. Page 1 is then copied to
- page 0 using fg_copypage. This process is repeated in a loop.
-
- To compile this program and link it with Fastgraph version 3.xx:
-
- BCC -ms FISHTANK.C FGS.LIB (Borland C++)
-
- CL /AS FISHTANK.C /link FGS (Microsoft C/C++ and Visual C++)
-
- QCL /AS FISHTANK.C /link FGS (Microsoft QuickC)
-
- PC /ms FISHTANK (Power C)
- PCL FISHTANK ;FGS
-
- TCC -ms FISHTANK.C FGS.LIB (Turbo C/C++)
-
- ZTC -ms FISHTANK.C FGS.LIB (Zortech C++)
-
- This program also can be linked with Fastgraph/Light (version 3.02 or
- later) if you replace the FGS library references with FGLS.
-
- For more examples of animation using Fastgraph, or for an evaluation
- copy of Fastgraph/Light, call DDBBS at (702) 796-7134. For Fastgraph
- voice support, call Ted Gruber Software at (702) 735-1980.
-
- \**********************************************************************/
-
- #include <fastgraf.h>
- #include <stdio.h>
- #include <stdlib.h>
-
- void main(void);
- void get_fish(void);
- void go_fish(void);
- int irandom(int min,int max);
- void put_fish(int fish_no,int x,int y,int fish_dir);
- void random_init(void);
-
- #define MAX(x,y) ((x) > (y)) ? (x) : (y)
- #define MIN(x,y) ((x) < (y)) ? (x) : (y)
-
- #define NFISH 11
-
- int seed;
-
- /*** fish bitmaps ***/
-
- char fish1[700];
- char fish2[1026];
- char fish3[884];
- char fish4[840];
- char fish5[682];
- char fish6[1224];
-
- /**********************************************************************\
- * *
- * main *
- * *
- \**********************************************************************/
-
- int colors[] = {0,1,2,3,4,5,6,7,16,0,18,19,20,21,22,23};
-
- void main()
- {
- int old_mode;
-
- /* make sure the system supports video mode 13 with 4 pages */
-
- if (fg_testmode(13,4) == 0)
- {
- printf("\n");
- printf("This program requires an EGA or VGA card\n");
- printf("with at least 128k. If an EGA card is\n");
- printf("present, it must be the active adapter.\n");
- exit(0);
- }
-
- /* initialize the video environment */
-
- old_mode = fg_getmode();
- fg_setmode(13);
- fg_palettes(colors);
- random_init();
-
- /* get the coral background from a file and put it on page 2 */
-
- fg_setpage(2);
- fg_move(0,199);
- fg_dispfile("coral.ppr",320,1);
-
- /* copy the background from page 2 to page 0, the visual page */
-
- fg_copypage(2,0);
-
- /* get the fish */
-
- get_fish();
-
- /* make the fish go */
-
- go_fish();
-
- /* restore the original video state */
-
- fg_setmode(old_mode);
- fg_reset();
- }
-
- /**********************************************************************\
- * *
- * get_fish -- fill up the fish bitmap arrays *
- * *
- \**********************************************************************/
-
- int fish_x1[] = {0, 64,128,200, 0, 80}; /* location of fish x & y */
- int fish_y1[] = {199,199,199,199,150,150};
- int width[] = { 28, 27, 34, 28, 31, 34}; /* size of fish: width */
- int height[] = { 25, 38, 26, 30, 22, 36}; /* size of fish: height */
-
- char *fishes[] = {fish1, /* for convenience, an array of pointers to fishes */
- fish2,
- fish3,
- fish4,
- fish5,
- fish6};
-
- void get_fish()
- {
- register int fish_num;
-
- /* get the fish from a file and put them on page 1 */
-
- fg_setpage(1);
- fg_move(0,199);
- fg_dispfile("fish.ppr",320,1);
-
- /* build the fish bitmaps */
-
- for (fish_num = 0; fish_num < 6; fish_num++)
- {
- fg_move(fish_x1[fish_num],fish_y1[fish_num]);
- fg_getimage(fishes[fish_num],width[fish_num],height[fish_num]);
- }
- }
-
- /**********************************************************************\
- * *
- * go_fish -- make the fish swim around *
- * *
- \**********************************************************************/
-
- /* There are 11 fish total, and 6 different kinds of fish. These
- * arrays keep track of what kind of fish each fish is, and how each
- * fish moves:
- *
- * fish[] -- which fish bitmap applies to this fish?
- * x[] -- starting x coordinate
- * y[] -- starting y coordinate
- *
- * xmin[] -- how far left (off screen) the fish can go
- * xmax[] -- how far right (off screen) the fish can go
- * xinc[] -- how fast the fish goes left and right
- * dir[] -- starting direction for each fish
- *
- * ymin[] -- how far up this fish can go
- * ymax[] -- how far down this fish can go
- * yinc[] -- how fast the fish moves up or down
- * yturn[] -- how long fish can go in the vertical direction
- * before stopping or turning around
- * ycount[] -- counter to compare to yturn
- */
-
- int fish[] = { 1, 1, 2, 3, 3, 0, 0, 5, 4, 2, 3};
- int x[] = {-100,-150,-450,-140,-200, 520, 620,-800, 800, 800,-300};
- int y[] = { 40, 60, 150, 80, 70, 190, 180, 100, 30, 130, 92};
-
- int xmin[] = {-300,-300,-800,-200,-200,-200,-300,-900,-900,-900,-400};
- int xmax[] = { 600, 600,1100,1000,1000, 750, 800,1200,1400,1200, 900};
- int xinc[] = { 2, 2, 8, 5, 5, -3, -3, 7, -8, -9, 6};
- int dir[] = { 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0};
-
- int ymin[] = { 40, 60, 120, 70, 60, 160, 160, 80, 30, 110, 72};
- int ymax[] = { 80, 100, 170, 110, 100, 199, 199, 120, 70, 150, 122};
- int yturn[] = { 50, 30, 10, 30, 20, 10, 10, 10, 30, 20, 10};
- int ycount[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- int yinc[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-
- void go_fish()
- {
- register int i;
- unsigned char key, aux;
-
- /* make the fish swim around */
-
- do
- {
- /* copy the background from page 2 to page 1 */
-
- fg_copypage(2,1);
-
- /* put all the fish on the background */
-
- for (i = 0; i < NFISH; i++)
- {
- fg_setpage(1);
- ycount[i]++;
- if (ycount[i] > yturn[i])
- {
- ycount[i] = 0;
- yinc[i] = irandom(-1,1);
- }
- y[i] += yinc[i];
- y[i] = MIN(ymax[i],MAX(y[i],ymin[i]));
-
- if (x[i] >= 0 && x[i] < 320)
- {
- put_fish(fish[i],x[i],y[i],dir[i]);
- }
- else if (x[i] < 0 && x[i] > -72)
- {
- fg_transfer(0,71,0,199,104,199,1,3);
- fg_setpage(3);
- put_fish(fish[i],x[i]+104,y[i],dir[i]);
- fg_transfer(104,175,0,199,0,199,3,1);
- }
- x[i] += xinc[i];
- if (x[i] <= xmin[i] || x[i] >= xmax[i])
- {
- xinc[i] = -xinc[i];
- dir[i] = 1 - dir[i];
- }
- }
-
- /* copy page 1 to page 0 */
-
- fg_setpage(0);
- fg_copypage(1,0);
-
- /* intercept a keystroke, if it is escape exit the program */
-
- fg_intkey(&key,&aux);
- }
- while (key != 27);
- }
-
- /**********************************************************************\
- * *
- * irandom -- random number generator *
- * *
- \**********************************************************************/
-
- irandom(min,max)
- int min,max;
- {
- int temp;
-
- temp = seed ^ (seed >> 7);
- seed = ((temp << 8) ^ temp) & 0x7FFF;
- return((seed % (max-min+1)) + min);
- }
-
- /**********************************************************************\
- * *
- * put_fish -- draw one of the six fish anywhere you want *
- * *
- \**********************************************************************/
-
- void put_fish(fish_num,x,y,fish_dir)
- int fish_num,x,y,fish_dir;
- {
- /* move to position where the fish will appear */
-
- fg_move(x,y);
-
- /* draw a left- or right-facing fish, depending on fish_dir */
-
- if (fish_dir == 0)
- fg_flpimage(fishes[fish_num],width[fish_num],height[fish_num]);
- else
- fg_clpimage(fishes[fish_num],width[fish_num],height[fish_num]);
- }
-
- /**********************************************************************\
- * *
- * random_init -- get a seed for the random number generator *
- * *
- \**********************************************************************/
-
- void random_init()
- {
- long fg_getclock();
-
- seed = (int)(fg_getclock() & 0x7FFF);
- }